//  布尔值

// ts的类型注解
let flag: boolean = true
// flag = 1
flag = false

// 数字型
let num1: number = 10
let num2: number = 0.5
let num3: number = -2

//  字符串
var str1:string="hello"
str1="hi"
//  模板字符串 ``反引号 配合${}数据填充
let username:string='张三'
let age:number=20
console.log(`我是${username},今年${age}岁`);

//undefined 和 null
let un:undefined = undefined
let nu:null=null
//变量定义了undefined和null类型，只能赋值该类型
let num4:number = undefined
let str2:string = null
//如果定义的变量类型需要做初始化或者显示未定义，可以将undefined，可以将undefined和null赋值给变量

//数组
//第一种定义数组方式，可以用数组符号[]进行定义，同时需要加上元素类型,数组元素赋值时必须使用定义的类型
let arr1:number[]=[1,2]
let arr2:string[]=['hi','hello']
//第二种方式用数组泛型，Array<元素类型>
let arr3: Array<boolean> =[true,false]
let arr4: Array<number>=[1,2,3]

//元组，允许数组中的每个元素不必相同,但是元素类型的赋值必须符合定义的数据类型顺序进行赋值
let arr5: [number,string,boolean]=[1,'hi',true]
arr5=[1,'hello',true]

// any:泛型，支持所有的数据类型
let arr6:any[]=["hi",1,false]
let allType:any = 5
allType='hello'
allType=true

//枚举， 为一组数据类型赋予友好的名字
enum Color {
    Red = 1,//自定义编号
    Blue,
    Pink
}
console.log(Color.Red,Color.Blue,Color.Pink);//0 1 2 编号
let myColor:string = Color[1]
console.log(myColor);
//编号默认从0开始，也可以自定义编号,如果只自定义一个编号，那么后面的编号就会依次递增，也可以每一个编号设置都不相同

//void 和 any 刚好相反，它表示没有任何类型，一般应用于没有函数返回值的情况
function test():void {
    // return 1
    // return 'hello'
    // return null
    return undefined
}

//object 表示非原始类型，也就是说除了number\string\boolean之外的类型
function test2(obj:object):object {
    // return null
    // return 1
    // return {}
    return obj
}
let fn=test2({name:'张三',age:20})
console.log(fn);

//联合类型 可以选用多种类型，但是只能取一种类型
function test3(params:number | string | boolean) {
    console.log(params)
}

test3('hello')
test3(123)
test3(true)

//注意：联合类型在使用时，一定要注意参数的操作和返回值
function test4(params:number | string) {
    // return params.length
    return params.toString().length//toString把数字转成字符串
}
console.log(test4(100));

//类型断言 数据类型的转换
//第一种使用尖括号进行转换<>
//第二种使用as语法进行转换
function test5(params: string |number){
    //返回参数的字符串或数字的长度
    if((<string>params).length){
        return (params as string).length
    }else{
        return params.toString().length
    }
}
console.log(test5(1000));

//类型推断
//TS在没有明确指定类型的时候，默认会推测出一个类型
let a =123
//a='hello'//变量在第一次赋值时，默认会推测为当前值的类型
a=100

//当变量定义了，但没有赋值，默认会推测为any类型
let b
b=456
b='hi'
b=true
b=[1,2,3]
